#include "ConexionBidireccional.h"

ConexionBidireccional::ConexionBidireccional(std::string host,SocketProtocoloPlano* socket,ColaMensajes* mensajes){
	this->host = host;
	this->mensajes = mensajes;
	this->sender =  new Sender(socket,mensajes);
	this->recever =  new Recever(socket,mensajes);
}

ConexionBidireccional::ConexionBidireccional(std::string host,SocketProtocoloPlano* socket,unsigned int listenPort,unsigned int broadcastPort,ColaMensajeRecibir* colaRecibir,ColaMensajeEnviar* colaEnviar){
	this->sender =  new Sender(broadcastPort,host,colaEnviar);
	this->recever =  new Recever(listenPort,host,colaRecibir);

	this->sender->start();
	this->recever->start();
}

ConexionBidireccional::ConexionBidireccional(SocketProtocoloPlano* socket,unsigned int listenPort,unsigned int broadcastPort,ColaMensajeRecibir* colaRecibir,ColaMensajeEnviar* colaEnviar){
	this->sender =  new Sender(broadcastPort,colaEnviar);
	this->recever =  new Recever(listenPort,colaRecibir);

	this->sender->start();
	this->recever->start();
}

void ConexionBidireccional::terminar(){
	//Cierro el sender
	this->sender->terminar();

	//Cierro el recever
	this->recever->terminar();
}

void ConexionBidireccional::join(){
	this->recever->join();
	this->sender->join();
}


bool ConexionBidireccional::isConnected(){
	return (this->sender->estaConectado() && this->recever->estaConectado());
}

int ConexionBidireccional::enviar(DTO* dto){
	int retorno =this->sender->enviar(dto);

	if(!this->sender->estaConectado())
		this->terminar();

	return retorno;
}

DTO* ConexionBidireccional::recibir(){
	DTO* retorno = this->recever->recibir();

	if(!this->recever->estaConectado())
		this->terminar();

	return retorno;
}

//No cerrar el socket.
ConexionBidireccional::~ConexionBidireccional(){

}
